﻿using System.Collections.Generic;
using System.Xml.Linq;


#region xml_Response_sample

//<?xml version="1.0" encoding="gb2312"?>
//<res>
//    <srccity>北京</srccity>
//    <destcity>沈阳</destcity>
//    <date>10AUG</date>
//    <re>
//        <direct>1</direct>
//        <segment>
//            <fn>CA1601</fn>
//            <src>PEK</src>
//            <dest>SHE</dest>
//            <dist>649</dist>
//            <oilTax>0</oilTax>
//            <airportTax>50</airportTax>
//            <depart>07:35</depart>
//            <arrive>08:45</arrive>
//            <ptype>738</ptype>
//            <stops>0</stops>
//            <price>700</price>
//            <sites>
//                <site>
//                    <TimeOfLastIssued>-1</TimeOfLastIssued>
//                    <cw>F</cw>
//                    <zw>1</zw>
//                    <p>1050</p>
//                    <zk>1.5</zk>
//                    <ticketAgents />
//                    <Restriction />
//                    <IsPromotion>0</IsPromotion>
//                    <PromotionContentID>0</PromotionContentID>
//                    <IsKSeat>0</IsKSeat>
//                    <IsManualKSeat>0</IsManualKSeat>
//                    <KSeatFileID>0</KSeatFileID>
//                </site>
//                <site>
//                    <TimeOfLastIssued>-1</TimeOfLastIssued>
//                    <cw>Y</cw>
//                    <zw>&gt;9</zw>
//                    <p>700</p>
//                    <zk>1</zk>
//                    <ticketAgents />
//                    <Restriction />
//                    <IsPromotion>0</IsPromotion>
//                    <PromotionContentID>0</PromotionContentID>
//                    <IsKSeat>0</IsKSeat>
//                    <IsManualKSeat>0</IsManualKSeat>
//                    <KSeatFileID>0</KSeatFileID>
//                </site>
//                <site>
//                    <TimeOfLastIssued>-1</TimeOfLastIssued>
//                    <cw>B</cw>
//                    <zw>&gt;9</zw>
//                    <p>640</p>
//                    <zk>0.91</zk>
//                    <ticketAgents />
//                    <Restriction />
//                    <IsPromotion>0</IsPromotion>
//                    <PromotionContentID>0</PromotionContentID>
//                    <IsKSeat>0</IsKSeat>
//                    <IsManualKSeat>0</IsManualKSeat>
//                    <KSeatFileID>0</KSeatFileID>
//                </site>
//            </sites>
//            <qs />
//            <eticket>1</eticket>
//        </segment>
//    </re>
//    <re>
//        <direct>1</direct>
//        <segment>
//            <fn>CA1651</fn>
//            <src>PEK</src>
//            <dest>SHE</dest>
//            <dist>649</dist>
//            <oilTax>0</oilTax>
//            <airportTax>50</airportTax>
//            <depart>08:50</depart>
//            <arrive>10:00</arrive>
//            <ptype>738</ptype>
//            <stops>0</stops>
//            <price>700</price>
//            <sites>
//                <site>
//                    <TimeOfLastIssued>-1</TimeOfLastIssued>
//                    <cw>F</cw>
//                    <zw>3</zw>
//                    <p>1050</p>
//                    <zk>1.5</zk>
//                    <ticketAgents />
//                    <Restriction />
//                    <IsPromotion>0</IsPromotion>
//                    <PromotionContentID>0</PromotionContentID>
//                    <IsKSeat>0</IsKSeat>
//                    <IsManualKSeat>0</IsManualKSeat>
//                    <KSeatFileID>0</KSeatFileID>
//                </site>
//                <site>
//                    <TimeOfLastIssued>-1</TimeOfLastIssued>
//                    <cw>Y</cw>
//                    <zw>&gt;9</zw>
//                    <p>700</p>
//                    <zk>1</zk>
//                    <ticketAgents />
//                    <Restriction />
//                    <IsPromotion>0</IsPromotion>
//                    <PromotionContentID>0</PromotionContentID>
//                    <IsKSeat>0</IsKSeat>
//                    <IsManualKSeat>0</IsManualKSeat>
//                    <KSeatFileID>0</KSeatFileID>
//                </site>
//            </sites>
//            <qs />
//            <eticket>1</eticket>
//        </segment>
//    </re>
//    <re>
//        <direct>1</direct>
//        <segment>
//            <fn>CA1645</fn>
//            <src>PEK</src>
//            <dest>SHE</dest>
//            <dist>649</dist>
//            <oilTax>0</oilTax>
//            <airportTax>50</airportTax>
//            <depart>11:40</depart>
//            <arrive>12:55</arrive>
//            <ptype>738</ptype>
//            <stops>0</stops>
//            <price>700</price>
//            <sites>
//                <site>
//                    <TimeOfLastIssued>-1</TimeOfLastIssued>
//                    <cw>F</cw>
//                    <zw>8</zw>
//                    <p>1050</p>
//                    <zk>1.5</zk>
//                    <ticketAgents />
//                    <Restriction />
//                    <IsPromotion>0</IsPromotion>
//                    <PromotionContentID>0</PromotionContentID>
//                    <IsKSeat>0</IsKSeat>
//                    <IsManualKSeat>0</IsManualKSeat>
//                    <KSeatFileID>0</KSeatFileID>
//                </site>
//                <site>
//                    <TimeOfLastIssued>-1</TimeOfLastIssued>
//                    <cw>Y</cw>
//                    <zw>&gt;9</zw>
//                    <p>700</p>
//                    <zk>1</zk>
//                    <ticketAgents />
//                    <Restriction />
//                    <IsPromotion>0</IsPromotion>
//                    <PromotionContentID>0</PromotionContentID>
//                    <IsKSeat>0</IsKSeat>
//                    <IsManualKSeat>0</IsManualKSeat>
//                    <KSeatFileID>0</KSeatFileID>
//                </site>
//            </sites>
//            <qs />
//            <eticket>1</eticket>
//        </segment>
//    </re>
//    <re>
//        <direct>1</direct>
//        <segment>
//            <fn>CA932</fn>
//            <src>PEK</src>
//            <dest>SHE</dest>
//            <dist>649</dist>
//            <oilTax>0</oilTax>
//            <airportTax>50</airportTax>
//            <depart>13:25</depart>
//            <arrive>14:40</arrive>
//            <ptype>738</ptype>
//            <stops>0</stops>
//            <price>700</price>
//            <sites>
//                <site>
//                    <TimeOfLastIssued>-1</TimeOfLastIssued>
//                    <cw>F</cw>
//                    <zw>1</zw>
//                    <p>1050</p>
//                    <zk>1.5</zk>
//                    <ticketAgents />
//                    <Restriction />
//                    <IsPromotion>0</IsPromotion>
//                    <PromotionContentID>0</PromotionContentID>
//                    <IsKSeat>0</IsKSeat>
//                    <IsManualKSeat>0</IsManualKSeat>
//                    <KSeatFileID>0</KSeatFileID>
//                </site>
//                <site>
//                    <TimeOfLastIssued>-1</TimeOfLastIssued>
//                    <cw>Y</cw>
//                    <zw>&gt;9</zw>
//                    <p>700</p>
//                    <zk>1</zk>
//                    <ticketAgents />
//                    <Restriction />
//                    <IsPromotion>0</IsPromotion>
//                    <PromotionContentID>0</PromotionContentID>
//                    <IsKSeat>0</IsKSeat>
//                    <IsManualKSeat>0</IsManualKSeat>
//                    <KSeatFileID>0</KSeatFileID>
//                </site>
//            </sites>
//            <qs />
//            <eticket>1</eticket>
//        </segment>
//    </re>
//    <re>
//        <direct>1</direct>
//        <segment>
//            <fn>CA1635</fn>
//            <src>PEK</src>
//            <dest>SHE</dest>
//            <dist>649</dist>
//            <oilTax>0</oilTax>
//            <airportTax>50</airportTax>
//            <depart>16:10</depart>
//            <arrive>17:15</arrive>
//            <ptype>738</ptype>
//            <stops>0</stops>
//            <price>700</price>
//            <sites>
//                <site>
//                    <TimeOfLastIssued>-1</TimeOfLastIssued>
//                    <cw>F</cw>
//                    <zw>6</zw>
//                    <p>1050</p>
//                    <zk>1.5</zk>
//                    <ticketAgents />
//                    <Restriction />
//                    <IsPromotion>0</IsPromotion>
//                    <PromotionContentID>0</PromotionContentID>
//                    <IsKSeat>0</IsKSeat>
//                    <IsManualKSeat>0</IsManualKSeat>
//                    <KSeatFileID>0</KSeatFileID>
//                </site>
//                <site>
//                    <TimeOfLastIssued>-1</TimeOfLastIssued>
//                    <cw>Y</cw>
//                    <zw>&gt;9</zw>
//                    <p>700</p>
//                    <zk>1</zk>
//                    <ticketAgents />
//                    <Restriction />
//                    <IsPromotion>0</IsPromotion>
//                    <PromotionContentID>0</PromotionContentID>
//                    <IsKSeat>0</IsKSeat>
//                    <IsManualKSeat>0</IsManualKSeat>
//                    <KSeatFileID>0</KSeatFileID>
//                </site>
//            </sites>
//            <qs />
//            <eticket>1</eticket>
//        </segment>
//    </re>
//    <re>
//        <direct>1</direct>
//        <segment>
//            <fn>CA1625</fn>
//            <src>PEK</src>
//            <dest>SHE</dest>
//            <dist>649</dist>
//            <oilTax>0</oilTax>
//            <airportTax>50</airportTax>
//            <depart>18:00</depart>
//            <arrive>19:15</arrive>
//            <ptype>738</ptype>
//            <stops>0</stops>
//            <price>700</price>
//            <sites>
//                <site>
//                    <TimeOfLastIssued>-1</TimeOfLastIssued>
//                    <cw>F</cw>
//                    <zw>5</zw>
//                    <p>1050</p>
//                    <zk>1.5</zk>
//                    <ticketAgents />
//                    <Restriction />
//                    <IsPromotion>0</IsPromotion>
//                    <PromotionContentID>0</PromotionContentID>
//                    <IsKSeat>0</IsKSeat>
//                    <IsManualKSeat>0</IsManualKSeat>
//                    <KSeatFileID>0</KSeatFileID>
//                </site>
//                <site>
//                    <TimeOfLastIssued>-1</TimeOfLastIssued>
//                    <cw>Y</cw>
//                    <zw>&gt;9</zw>
//                    <p>700</p>
//                    <zk>1</zk>
//                    <ticketAgents />
//                    <Restriction />
//                    <IsPromotion>0</IsPromotion>
//                    <PromotionContentID>0</PromotionContentID>
//                    <IsKSeat>0</IsKSeat>
//                    <IsManualKSeat>0</IsManualKSeat>
//                    <KSeatFileID>0</KSeatFileID>
//                </site>
//            </sites>
//            <qs />
//            <eticket>1</eticket>
//        </segment>
//    </re>
//    <re>
//        <direct>1</direct>
//        <segment>
//            <fn>CA1653</fn>
//            <src>PEK</src>
//            <dest>SHE</dest>
//            <dist>649</dist>
//            <oilTax>0</oilTax>
//            <airportTax>50</airportTax>
//            <depart>21:20</depart>
//            <arrive>22:30</arrive>
//            <ptype>738</ptype>
//            <stops>0</stops>
//            <price>700</price>
//            <sites>
//                <site>
//                    <TimeOfLastIssued>-1</TimeOfLastIssued>
//                    <cw>F</cw>
//                    <zw>8</zw>
//                    <p>1050</p>
//                    <zk>1.5</zk>
//                    <ticketAgents />
//                    <Restriction />
//                    <IsPromotion>0</IsPromotion>
//                    <PromotionContentID>0</PromotionContentID>
//                    <IsKSeat>0</IsKSeat>
//                    <IsManualKSeat>0</IsManualKSeat>
//                    <KSeatFileID>0</KSeatFileID>
//                </site>
//                <site>
//                    <TimeOfLastIssued>-1</TimeOfLastIssued>
//                    <cw>Y</cw>
//                    <zw>&gt;9</zw>
//                    <p>700</p>
//                    <zk>1</zk>
//                    <ticketAgents />
//                    <Restriction />
//                    <IsPromotion>0</IsPromotion>
//                    <PromotionContentID>0</PromotionContentID>
//                    <IsKSeat>0</IsKSeat>
//                    <IsManualKSeat>0</IsManualKSeat>
//                    <KSeatFileID>0</KSeatFileID>
//                </site>
//            </sites>
//            <qs />
//            <eticket>1</eticket>
//        </segment>
//    </re>
//</res>

#endregion

namespace eLongLoginTest.Air_Search_Helper
{
    /// <summary>
    /// 机票查询返回结果解析类
    /// </summary>
    /// 

     class ResponseItemSite
    {
        public string TimeOfLastIssued { get; set; }
        public string cw { get; set; }
        public string zw { get; set; }
        public string p { get; set; }
        public float zk { get; set; }
        public string ticketAgents { get; set; }
        public string Restriction { get; set; }
        public bool IsPromotion { get; set; }
        public int PromotionContentID { get; set; }
        public bool IsKSeat { get; set; }
        public bool IsManualKSeat { get; set; }
        public int KSeatFileID { get; set; }
    }

    class ResponseItems
    {
        /// <summary>
        /// 方向
        /// </summary>
        public string direct { get; set; }


        /// <summary>
        /// 
        /// </summary>
        public string fn { get; set; }

        /// <summary>
        /// 起始城市代码
        /// </summary>
        public string src { get; set; }

        /// <summary>
        /// 目的地城市代码
        /// </summary>
        public string dest { get; set; }


        /// <summary>
        /// 
        /// </summary>
        public string dist { get; set; }


        /// <summary>
        /// 燃油税
        /// </summary>
        /// 
        public string oilTax { get; set; }


        /// <summary>
        /// 机场建设费
        /// </summary>
        public string airportTax { get; set; }


        /// <summary>
        /// 出发时间
        /// </summary>
        public string depart { get; set; }


        /// <summary>
        /// 到达时间
        /// </summary>
        public string arrive { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public string ptype { get; set; }

        /// <summary>
        /// 停靠机场
        /// </summary>
        public string stops { get; set; }


        /// <summary>
        /// 票价
        /// </summary>
        public string price { get; set; }

        /// <summary>
        /// 每个座位的信息
        /// </summary>
        public List<ResponseItemSite> sites = new List<ResponseItemSite>();

        /// <summary>
        /// 是否为电子票
        /// </summary>
        public bool eticket { get; set; }

    }

    class FlightSearchResponseBody :IResponseBody
    {
        /// <summary>
        /// 起始城市
        /// </summary>
        public string srccity { get; set; }

        /// <summary>
        /// 目的城市
        /// </summary>
        public string destcity { get; set; }
        
        /// <summary>
        /// 出发日期
        /// </summary>
        public string date { get; set; }

        /// <summary>
        /// 每个航班信息
        /// </summary>
        public List<ResponseItems> items = new List<ResponseItems>();

        /// <summary>
        /// 默认的构造函数
        /// </summary>
        public FlightSearchResponseBody() { 
        
        }

        /// <summary>
        /// 解析返回的XML内容，绑定到某个委托之上去
        /// </summary>
        /// <param name="XML">返回的XML内容</param>
        public void DeSerialize(string XML){
            XElement ResponseBody = XElement.Parse(XML);
            //解析起始城市的值
            srccity = (string)ResponseBody.Element("srccity");
            //解析目的地城市的值
            destcity = (string)ResponseBody.Element("destcity");
            //解析出发时间的值
            date = (string)ResponseBody.Element("date");

            //解析全部的回复
            IEnumerable<XElement> res = ResponseBody.Descendants("re");
            
            //解析每一个回复开始<re>
            foreach(XElement re in res){
                //初始化一个新的航班
                ResponseItems oneItem = new ResponseItems();
                oneItem.direct = (string)re.Element("direct");
                //得到一个新的段<segment>
                IEnumerable<XElement> re_seg = re.Descendants("segment");

                //解析每一段<segment>
                foreach(XElement re_con in re_seg){
                    oneItem.fn = (string)re_con.Element("fn");
                    oneItem.src = (string)re_con.Element("src");
                    oneItem.dest = (string)re_con.Element("dest");
                    oneItem.oilTax = (string)re_con.Element("oilTax");
                    oneItem.airportTax = (string)re_con.Element("airportTax");
                    oneItem.depart = (string)re_con.Element("depart");
                    oneItem.arrive = (string)re_con.Element("arrive");
                    oneItem.ptype = (string)re_con.Element("ptype");
                    oneItem.stops = (string)re_con.Element("stops");
                    oneItem.price = (string)re_con.Element("price");
                

                            //解析每一个回复中的每一张机票开始
                            IEnumerable<XElement> sites = re_con.Descendants("site");
                                foreach (XElement site in sites)
                                {
                                    //初始化一个新的座位
                                    ResponseItemSite oneSite = new ResponseItemSite();
                                    oneSite.TimeOfLastIssued = (string)site.Element("TimeOfLastIssued");
                                    oneSite.cw = (string)site.Element("cw");
                                    oneSite.zw = (string)site.Element("zw");
                                    oneSite.p = (string)site.Element("p");
                                    oneSite.zk = (float)site.Element("zk");
                                    oneSite.ticketAgents=(string)site.Element("ticketAgents");
                                    oneSite.Restriction = (string)site.Element("Restriction");
                                    oneSite.IsPromotion = (bool)site.Element("IsPromotion");
                                    oneSite.PromotionContentID = (int)site.Element("PromotionContentID");
                                    oneSite.IsKSeat = (bool)site.Element("IsKSeat");
                                    oneSite.IsManualKSeat = (bool)site.Element("IsManualKSeat");
                                    oneSite.KSeatFileID = (int)site.Element("KSeatFileID");
                                    
                                    //给正在解析的这条航班信息加入一条座位信息
                                    oneItem.sites.Add(oneSite); 
                                }
                                //解析每张机票结束

                    //是否是电子票
                    oneItem.eticket = (bool)re_con.Element("eticket");

                //给实例加入一个航班信息
                items.Add(oneItem);

                }
            }
            //解析每个回复结束
 
        }
    }
}
